using System;
using System.Collections.Generic;
using System.Text;


namespace WindowsApplicationLZ77.Binario
{
    class Binario32
    {
        #region Atributos de Clase

        private static readonly string DIGITOS_INVALIDOS = "Contiene digitos NO binarios o la _longitud del String NO es 32.";

        private static readonly string STR_CERO_32 = "000000000000000000000000000000";
        private static readonly UInt32 UINT_CERO_32 = 0;

        #endregion

        private string strBits;
        private UInt32 valor;

        #region Propiedades

        public string StrBits
        {
            get { return strBits; }
            set { strBits = value; }
        }

        public UInt32 Valor
        {
            get { return valor; }
            set { valor = value; }
        }

        #endregion

        public Binario32() 
        {
            strBits = STR_CERO_32;
            Valor = 0;
        }

        public Binario32(string strBits) 
        {
            if( Validar(strBits) == false )
            {
                throw new Binario32Exception( strBits , DIGITOS_INVALIDOS );
            }

            this.StrBits = strBits;
            this.Valor = Parse( strBits );
        }

        /// <summary>
        /// PRE: strBits.Length == 32 y strBits contiene solo digitos binarios.
        /// </summary>
        /// <param name="strBits"></param>
        /// <returns></returns>
        private uint Parse(string strBits)
        {
            UInt32 resultado = 0;
            char c;
            int pos = 0;
            int i = 31;
            while( pos <= 31)
            {
                c = strBits[ 31 - pos ];

                if (c == '1')
                {
                    resultado = resultado + (UInt32)Math.Pow(2, pos);
                }

                pos++;
            }

            return resultado;
        }

        private bool Validar(string strNumero)
        {
            bool ok = true;
            int longitud = strNumero.Length;
            
            char c = '9';
            int i = 0;

            while( i < longitud)
            {
                c = strNumero[i];

                if (c != '0' && c != '1')
                {
                    ok = false;
                }

                i++;
            }

            return ok && longitud == 32;
        }


        public override string ToString() 
        {
            return "strBits="+strBits + " | " + "valor=" + Valor.ToString();
        }

        public int IntValue()
        {
            return (int)Valor;
        }

        private static string CompletarAIzquierda(string codigo)
        {
            string nuevoCodigo = codigo;

            for (int i = 0; i <= 32; i++ )
            {
                nuevoCodigo = "0" + nuevoCodigo;
                System.Console.WriteLine(nuevoCodigo);
            }

            return nuevoCodigo;
        }
    }
}
